package br.com.websec.fornecedor;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import br.com.websec.usuario.Usuario;
import br.com.websec.usuario.UsuarioRN;
import br.com.websec.util.ArquivoUtil;
import br.com.websec.util.DAOFactory;
import br.com.websec.xml.RecuperaRemessaXML;
import br.com.websec.xml.RemessaXML;
import br.com.websec.xml.TituloXML;

public class FornecedorRN {

	private FornecedorDao fornecedorDao;

	public FornecedorRN() {
		this.fornecedorDao = DAOFactory.criaFornecedorDAO();
	}

	public void salvarFornecedor(Fornecedor fornecedor, String senha) {
		Integer codigo = fornecedor.getIdFornecedor();

		if (codigo == null || codigo == 0) {

			fornecedor.setDtCadastro(new Date());
			Usuario usuario = definirUsuario(senha,fornecedor.getRazaoSocial(), fornecedor.getEmail());
			usuario.getPermissao().add("ROLE_ADMINISTRADOR");
			usuario.getPermissao().add("ROLE_USUARIO");
			UsuarioRN uRN = new UsuarioRN();		
			this.fornecedorDao.salvar(fornecedor);
			uRN.salvar(usuario);

		} else {
			this.fornecedorDao.alterar(fornecedor);
		}
	}

	public Usuario definirUsuario(String senha, String nome, String email) {

		Usuario u = new Usuario();
		u.setAtivo(true);
		u.setNome(nome);
		u.setSenha(senha);
		u.setEmail(email);
		return u;

	}
	
	public void enviarArquivo(FileUploadEvent event){
		
		ArquivoUtil arquivoUtil = new ArquivoUtil();
		    	UploadedFile uploadedFile = event.getFile();				
				byte[] arquivo = uploadedFile.getContents();
				boolean salvo = false;
				
				if (arquivo != null) {			
					String nomeArquivo = uploadedFile.getFileName();					
					salvo = arquivoUtil.upload(arquivo, nomeArquivo);
					
					if (salvo) {
						String info = "Arquivo recebido: " + nomeArquivo;
						FacesContext facesContext = FacesContext.getCurrentInstance();
					    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", info));
					    try {
					    	importaArquivo();
					    	facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", info));
							
						} catch (Exception e) {
							String erro = "Erro na gravação do arquivo no banco de dados: " + nomeArquivo;
							facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro: ", erro));			

						}
					    
						return;					
					}									
					String erro = "Erro no envio do arquivo: " + nomeArquivo;
					FacesContext facesContext = FacesContext.getCurrentInstance();
					facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro: ", erro));			

		}

	}
	
	public void importaArquivo(){

    	RemessaXML r = RecuperaRemessaXML.lerXml();
		TituloXML tXML = new TituloXML();
		
		FacesContext context = FacesContext.getCurrentInstance();
		
		try{
			tXML.populaTituloXML(r);
			FacesMessage msg = new FacesMessage("Sucesso", " Arquivo importado para o banco de dados - Os arquivos CNABs correspondentes serão gerados.");  
	        FacesContext.getCurrentInstance().addMessage("teste", msg);
		}
		catch(Exception ex){
			
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"Erro ao localizar Banco", "Banco não suportado ou nulo.");
			context.addMessage(null, msg);
		}
    }


	public Fornecedor buscarPorEmail(String email) {
		
		return this.fornecedorDao.buscarPorEmail(email);
	}

	public Fornecedor buscarPorId(Integer fornecedor) {
		
		return this.fornecedorDao.buscarPorId(fornecedor);
	}
	
	public List<Fornecedor> listarFornecedor(Integer fornecedor) {
		
		return this.fornecedorDao.listarFornecedores(fornecedor);
	}
	
	public List<Fornecedor> listarFornecedoresSistema(){
		
		return this.fornecedorDao.listarFornedoresSistema();
	}
	
	public List<Fornecedor> listar(){
		
		return this.fornecedorDao.listar();
	}


}
